import MySQLdb
import consultasBD
from datetime import date
from datetime import datetime
import Mensaje
import Dialog2
import wx

ROJO = (255, 145, 145, 255)
VERDE = (145, 255, 145, 255)
AZUL = (145, 145, 255, 255)
BLANCO = (255, 255, 255, 255)
AMARILLO = (254, 248, 191, 255)

def logOperaciones(texto):
    fechaHora = str(datetime.today())
    cadena  = fechaHora[:19] + " " + texto
    cadena += "\n"
    f = open("log_Operacion.txt","a")
    f.write(cadena)
    f.close()

def logBD(texto):
    fechaHora = str(datetime.today())
    cadena = fechaHora[:19] + " " + texto + "\n"
    f = open("log_BD.txt","a")
    f.write(cadena)
    f.close()

def getSucursalActiva(CONECTADO):
    sql = "SELECT idsucursal FROM sucursales WHERE activa = 1"
    result, CONECTADO = consultasBD.ordenCrudaResultDict(sql, CONECTADO)
    if len(result) == 0:
        print "No hay sucursal activa en la BD"
        logOperaciones("utiles.py: getSucursalActiva() -> no hay sucursal activa en la BD")
        return ("0", CONECTADO)
    else:
        return (str(result['idsucursal']), CONECTADO)

def formatear_fecha(fecha):
    aux = str(fecha).split("/")
    return "%s/%s/%s %s" % (aux[1], aux[0], aux[2], "00:00:00")

def formatear_fecha_date(fecha):
    #return "01-07-2008 00:00:00"
    print "fecha ", str(fecha)
    aux = str(fecha).split(" ")[0].split("/")
    return "%s-%s-%s %s" % (aux[2], aux[0], aux[1], "00:00:00")    

def formatear_fecha_date2(fecha):
    aux = str(fecha).split(" ")[0].split("/")
    return "%s-%s-%s" % (aux[2], aux[0], aux[1])  
    
def cargar_fecha(fecha, date_picker):
    aux = str(fecha).split(" ")[0].split("-")
    
    f = wx.DateTime.Today()
    f.SetYear(int(aux[0]))
    f.SetMonth(int(aux[1]) - 1)
    f.SetDay(int(aux[2]))    
    date_picker.SetValue(f)    

def mensaje(parent, texto):
    '''Muestra un dialogo en la pantalla con un mensaje'''
    dlg = Mensaje.Mensaje(parent,texto)
    try:
        dlg.ShowModal()            
    finally:
        dlg.Destroy()                 
    return False    

def dialog2(parent, texto):
    '''Muestra una ventana donde debe Aceptarse o Cancelarse una accion'''
    dlg = Dialog2.Dialog2(parent, texto)
    opcion = False
    try:
        dlg.ShowModal()
        opcion = dlg.getSeleccion()
    finally:
        dlg.Destroy()
    return opcion

def mensaje_procesando(parent):
    ''''''
    dlg = Mensaje.Mensaje(parent,texto)
    try:
        dlg.Show()         
    finally:
        dlg.Destroy()
    return False  

def getfechatoday(self):
    now = date.today()
    return str(now.strftime("%d-%m-%y"))

def getfechaDiaLaboral(fecha, valor, CONECTADO):
    #fecha es tipo datetime y devuelve ese mismo tipo de datos
    #valor es positivo o negativo, segun sume o reste dias. fecha+valor=nuevaFecha
    from datetime import timedelta
    from consultasBD import ordenCruda
    consultaSQL = "SELECT fecha FROM feriados"
    resultado, CONECTADO = ordenCruda(consultaSQL, CONECTADO)
    feriado = [] 
    for dia in resultado:
        feriado.append(dia[0])
    dif = timedelta(days=valor)
    fecha = fecha + dif
    while (fecha in feriado) or ((diaSemana(fecha) == 7)):
        fecha = fecha + dif
    return (fecha, CONECTADO)

def sumarDiasAFecha(fecha,valor):
    #fecha es tipo datetime y devuelve ese mismo tipo de datos
    #valor es positivo o negativo, segun sume o reste dias. fecha+valor=nuevaFecha
    from datetime import timedelta
    dif = timedelta(days=valor)
    fecha = fecha + dif
    return fecha

def getfechaDiaLaboralAnterior(fecha):
    #recibe y devuelve un valor datetime
    return getfechaDiaLaboral(fecha,-1)

def getfechaDiaLaboralSiguiente(fecha):
    #recibe y devuelve un valor datetime
    return getfechaDiaLaboral(fecha,1)

def sumarDiasLaboralesAFecha(valor):
    aux = strToDate(getfechaInverse())
    if valor == 0:
        return aux
    if valor < 0:
        multiplicador = -1
    else:
        multiplicador = 1
    valor = abs(valor)
    for i in xrange(valor):
        aux = getfechaDiaLaboral(aux,multiplicador)
    return aux

def getfecha15LaboralesAtras():
    aux = strToDate(getfechaInverse())
    for i in xrange(15):
        aux = getfechaDiaLaboral(aux,-1)
    return aux

def diaSemana(fecha):
    #1 Lunes, 2 Martes, 3, Miercoles, 4 Jueves, 5, Viernes, 6 Sabado, 7 Domingo
    return fecha.isoweekday()

def isDiaNoLaboral(fecha, CONECTADO):
    from consultasBD import ordenCruda
    consultaSQL = "SELECT fecha FROM feriados"
    resultado, CONECTADO = ordenCruda(consultaSQL, CONECTADO)
    feriado = []
    for dia in resultado:
        feriado.append(dia[0])
    if (fecha in feriado) or ((diaSemana(fecha) == 7)):
        return True
    else:
        return False

def isDiaLaboral(fecha):
    return not isDiaNoLaboral(fecha)
    
def getfechaInverse():
    now = date.today()
    return now.strftime("%Y-%m-%d")

def getfecha():
    now = date.today()
    return str(now.strftime("%d-%m-%Y"))
        
def getfechaInverseTime():
    import time
    return time.strftime("%Y-%m-%d %H:%M-%S")

def convertirFecha(fecha):
    return fecha.strftime("%d-%m-%Y")
            
def getDaysExtreme():
    from calendar import monthrange
    from datetime import datetime
    from time import strptime
    now = date.today()
    mes = int(now.strftime("%m"))
    anio = int(now.strftime("%Y"))
    primerDia = '01'+str(now.strftime("-%m-%Y"))
    ultimoDia = str(monthrange(int(anio),int(mes))[1])+str(now.strftime("-%m-%Y"))
    print primerDia
    primerDia = datetime(*strptime(primerDia, "%d-%m-%Y")[0:5])
    print primerDia
    ultimoDia = datetime(*strptime(ultimoDia, "%d-%m-%Y")[0:5])
    return [primerDia, ultimoDia]
    
def isFechaDelMesActual(fecha):
    #fecha debe venir como datetime y en formato Y-m-d
    return getfechaInverse()[:7] == str(fecha)[:7]

def isFechaDelMesAnterior(fecha):
    #fecha debe venir como datetime y en formato Y-m-d
    return getfechaInverse()[:7] > str(fecha)[:7]

def strToDate(fecha):
    #recibe un string en formato Y-m-d y devuelve un datetime.date de forma %Y-%m-%d
    return date(*map(int,fecha.split("-")))

def invertirFecha(fecha):
    #recibe un string en formato d-m-Y y lo devuelve como Y-m-d
    return fecha[-4:]+"-"+fecha[3:5]+"-"+fecha[:2]

def getFechaLaboralMesSiguiente(fecha):
    from datetime import timedelta
    dif = timedelta(days=30)
    fecha = fecha + dif
    if isDiaNoLaboral(fecha):
        return getfechaDiaLaboralSiguiente(fecha)
    else:
        return fecha
    
def cambiaFormatoFecha(self,fecha):
    dia = fecha.GetDay()
    if dia < 10:
        dia = "0"+str(dia)
        
    mes = fecha.GetMonth() + 1
    if mes < 10:
        mes = "0"+str(mes)
        
    anio = (str(fecha.GetYear()))[2:]
    
    return "%s-%s-%s" % (dia,mes,anio)
